bitkeeper revision 1.1159.212.86 (4203944ddTnTLXj6fYycRHIqY8hdCQ)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Fri, 4 Feb 2005 15:27:09 +0000 (15:27 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Fri, 4 Feb 2005 15:27:09 +0000 (15:27 +0000)
Fix 64-bit domain builder to correctly determine required number of
page-table pages to build DOM0 image.
Signed-off-by: keir.fraser@cl.cam.ac.uk
xen/arch/x86/x86_64/domain_build.c

index e660c741853adec5855c5db46efc390cca15925c..6b3ec1e86c0d572aedc25a4aa929c2e376746425 100644 (file)
@@ -130,15 +130,13 @@ int construct_dom0(struct domain *d,
         v_end            = (vstack_end + (1UL<<22)-1) & ~((1UL<<22)-1);
         if ( (v_end - vstack_end) < (512UL << 10) )
             v_end += 1UL << 22; /* Add extra 4MB to get >= 512kB padding. */
-#define RD(_p,_s) ((_p) >> (_s))                      /* round up */
-#define RU(_p,_s) (((_p) + ((1UL<<(_s))-1)) >> (_s))  /* round down */
+#define NR(_l,_h,_s) \
+    (((((_h) + ((1UL<<(_s))-1)) & ~((1UL<<(_s))-1)) - \
+       ((_l) & ~((1UL<<(_s))-1))) >> (_s))
         if ( (1 + /* # L4 */
-              (RU(v_end, L4_PAGETABLE_SHIFT) - 
-               RD(dsi.v_start, L4_PAGETABLE_SHIFT)) + /* # L3 */
-              (RU(v_end, L3_PAGETABLE_SHIFT) - 
-               RD(dsi.v_start, L3_PAGETABLE_SHIFT)) + /* # L2 */
-              (RU(v_end, L2_PAGETABLE_SHIFT) - 
-               RD(dsi.v_start, L2_PAGETABLE_SHIFT)))  /* # L1 */
+              NR(dsi.v_start, v_end, L4_PAGETABLE_SHIFT) + /* # L3 */
+              NR(dsi.v_start, v_end, L3_PAGETABLE_SHIFT) + /* # L2 */
+              NR(dsi.v_start, v_end, L2_PAGETABLE_SHIFT))  /* # L1 */
              <= nr_pt_pages )
             break;
     }